package cn.le.studyEnum;

import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;

import java.text.DateFormat;
import java.util.Date;
import java.util.EnumSet;
import java.util.Map;

/**
 * enum特性之一，它允许程序员为enum实例编写方法，从而为每个enum实例赋予各自不同的行为，
 * 要实现常量的相关方法，需要为enum定义一个或多个abstract方法，然后为每个enum实例实现该抽象方法
 *
 */
public enum ConstantSpecificMethod {

    DATE_TIME{
        String getInfo()
        {
            return DateFormat.getDateInstance().format(new Date());
        }
    },
    CLASSPATH{
      String getInfo()
        {
            return System.getenv("PATH");
        }
    },
    VERSION{
        String getInfo()
        {
            return System.getProperty("java.version");
        }
    };

    abstract String getInfo();

    public static void main(String[] args)
    {
        for (ConstantSpecificMethod csm: values() ) {
            System.out.println(csm.getInfo());
        }

        System.out.println(ConstantSpecificMethod.CLASSPATH.getInfo());
    }
}

/**
 * 洗车例子：每个顾客在洗车时，都有一个选择菜单，每个选择菜单对应一个不同的动作，可以将一个常量相关的方法关联
 * 到一个选择上，再使用一个EnumSet来保存客户的选择。
 *
 */
class CarWash{

    public enum Cycle{
        UNDERBODY{
            void action()
            {
                System.out.println("Spraying the underbody");
            }
        },
        WHEELWASH{
            void action()
            {
                System.out.println("Washing the wheels");
            }
        },
        PREWASH{
            void action()
            {
                System.out.println("Loosening the dirt");
            }
        },
        BASIC{
            void action()
            {
                System.out.println("The basic wash");
            }
        },
        HOTWAX{
            void action()
            {
                System.out.println("Applying hot wax");
            }
        },
        RINSE{
            void action()
            {
                System.out.println("Rinsing");
            }
        },
        BLOWDRY{
            void action()
            {
                System.out.println("Blowing dry");
            }
        };

        abstract void action();
    }

    EnumSet<Cycle> cycles = EnumSet.of(Cycle.BASIC,Cycle.RINSE);

    public void add(Cycle cycle)
    {
        cycles.add(cycle);
    }
    public void washCar()
    {
        for (Cycle c : cycles ) {
            c.action();
        }
    }
    public String toString()
    {
        return cycles.toString();
    }

    public static void main(String[] args) {

        CarWash wash = new CarWash();
        System.out.println(wash);
        wash.washCar();
        wash.add(Cycle.BLOWDRY);
        wash.add(Cycle.BLOWDRY);
        wash.add(Cycle.RINSE);
        wash.add(Cycle.HOTWAX);

        System.out.println(wash);
        wash.washCar();
    }
}

/**
 * 除了实现abstract方法外，还可以覆盖重写常量相关的方法
 *
 */
enum OverrideConstantSpecific{

    NUT,BOLT,
    WASHER{
        void f()
        {
            System.out.println("Overridden method");
        }
    };
    void f()
    {
        System.out.println("default behavior");
    }

    public static void main(String[] args) {
        for (OverrideConstantSpecific cos: values()) {
            System.out.print(cos+":");
            cos.f();
        }
    }
}

















